package com.example.ai_basedintelligentdiagnosisandtreatmentofchildren.viewmodel;

import android.app.Activity;
import android.content.Context;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.example.ai_basedintelligentdiagnosisandtreatmentofchildren.R;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 登录界面的 ViewModel 类，负责处理登录逻辑和数据管理
public class LoginViewModel extends ViewModel {
    // 创建一个单线程的执行器服务，用于执行异步任务，避免创建过多线程导致资源浪费
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    // 存储登录过程中产生的错误信息
    private String errorMessage;

    // 用于存储账号输入框组件的 LiveData，可观察其值的变化
    public final MutableLiveData<EditText> edtAccount = new MutableLiveData<>();
    // 用于存储密码输入框组件的 LiveData，可观察其值的变化
    public final MutableLiveData<EditText> edtPassword = new MutableLiveData<>();
    // 用于存储家长登录按钮组件的 LiveData，可观察其值的变化
    public final MutableLiveData<Button> btnParentLogin = new MutableLiveData<>();
    // 用于存储医生登录按钮组件的 LiveData，可观察其值的变化
    public final MutableLiveData<Button> btnDoctorLogin = new MutableLiveData<>();
    // 用于存储忘记密码文本组件的 LiveData，可观察其值的变化
    public final MutableLiveData<TextView> tevForgetPassword = new MutableLiveData<>();
    // 用于存储注册账号文本组件的 LiveData，可观察其值的变化
    public final MutableLiveData<TextView> tevRegisterAccount = new MutableLiveData<>();

    // 定义一个登录结果的回调接口，用于在登录完成后通知调用者登录结果
    public interface OnLoginResultListener {
        // 登录结果的回调方法，isSuccess 表示登录是否成功，errorMessage 表示错误信息
        void onLoginResult(boolean isSuccess, String errorMessage);
    }

    // 初始化界面视图组件的方法，将布局文件中的组件与 ViewModel 中的 LiveData 关联
    public void initViews(Context context){
        Activity activity = (Activity) context;
        edtAccount.setValue(activity.findViewById(R.id.input_account));
        edtPassword.setValue(activity.findViewById(R.id.input_password));
        btnParentLogin.setValue(activity.findViewById(R.id.btn_parentLogin));
        btnDoctorLogin.setValue(activity.findViewById(R.id.btn_doctorLogin));
        tevForgetPassword.setValue(activity.findViewById(R.id.tv_forgetPassword));
        tevRegisterAccount.setValue(activity.findViewById(R.id.tv_registerAccount));
    }

    // 异步执行登录操作的方法，接收角色和登录结果监听器作为参数
    public void loginAsync(String role, OnLoginResultListener listener) {
        // 从 LiveData 中获取账号输入框和密码输入框组件
        EditText accountEditText = edtAccount.getValue();
        EditText passwordEditText = edtPassword.getValue();

        // 检查输入框组件是否为空，如果为空则处理错误并返回
        if (accountEditText == null || passwordEditText == null) {
            handleError("输入框未正确初始化", listener);
            return;
        }

        // 获取账号输入框和密码输入框中的文本，并去除首尾空格
        String accountValue = accountEditText.getText().toString().trim();
        String passwordValue = passwordEditText.getText().toString().trim();

        // 检查账号是否为空，如果为空则处理错误并返回
        if (accountValue.isEmpty()) {
            handleError("账号为空！", listener);
            return;
        }

        // 检查密码是否为空，如果为空则处理错误并返回
        if (passwordValue.isEmpty()) {
            handleError("密码为空！", listener);
            return;
        }

        listener.onLoginResult(true, null);
        /*// 提交一个异步任务到执行器服务中执行登录验证操作
        executorService.submit(() -> {
            new UserDao().authenticateUser(accountValue, passwordValue, role, isAuthenticated -> {
                if (!isAuthenticated) {
                    handleError("账号或密码错误！", listener);
                } else {
                    // 如果认证成功，调用监听器的 onLoginResult 方法通知登录成功
                    listener.onLoginResult(true, null);
                }
            });
        });*/
    }

    // 统一处理错误的方法，接收错误信息和登录结果监听器作为参数
    private void handleError(String message, OnLoginResultListener listener) {
        // 将错误信息赋值给 errorMessage 变量
        errorMessage = message;
        // 如果监听器不为空，调用监听器的 onLoginResult 方法通知登录失败并传递错误信息
        if (listener != null) {
            listener.onLoginResult(false, errorMessage);
        }
    }

    // 当 ViewModel 被清除时调用的方法，用于关闭执行器服务，防止内存泄漏
    @Override
    protected void onCleared() {
        super.onCleared();
        executorService.shutdown();
    }
}